﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication27
{
    public static class PotegowanieModulo
    {
        private static List<Liczba> binaryzacja(Liczba a)
        {
            Liczba dwa = new Liczba("2", a.system);

            Liczba t;

            List<Liczba> kolejka = new List<Liczba>();


            while (a.element[0] != 0)
            {
                
                t=a%dwa;
                
               // Console.WriteLine("binaryzacja: " + a + " " + t);
                kolejka.Add(t);

                a = a / dwa;
                
            }

           

           

            Console.WriteLine("ILOSC BITOW: {0}", kolejka.Count());
            return kolejka;



        }

        public static List<Liczba> ToBin(Liczba a)
        {
            return binaryzacja(a);          
        }


        public static Liczba modulo(Liczba a, Liczba b, Liczba n)
        {
            List<Liczba> bits=binaryzacja(b);
            int dlugoscbitow = bits.Count();
            Liczba wynik = new Liczba("1", a.system);
            a = a % n;
            Liczba x = a;

           

            for (int i = 0; i < dlugoscbitow; i++)
            {
                if (bits[i].element[0]==1)
                {
                    wynik = wynik * x;
                    wynik = wynik % n;
                }
                x = x * x;
                x=x % n;
                //Console.WriteLine("WYNIK: {0} X: {1}", wynik, x);

            }

            return wynik;
        }


    }
}
